#include "include.h"

/*  查看网络状态*/
Ticker tciker_Net_Status;
/*  1000ms检测一次网络状态*/
#define query_period 2000

void Net_Status_Query_Init(void) {
    system_status.net_status = NO_Connect_Wifi;
    tciker_Net_Status.attach_ms(query_period, tciker_Net_Status_callback);
}

/*
 *  查看网络状态 - tciker回调函数
 *  如果出现问题，就关闭定时器
 */
void tciker_Net_Status_callback() {
    if (WiFi.status() == WL_CONNECTED) {
        system_status.net_status = Connected_Wifi;
        /*  如果秘钥错误*/
        if(system_status.secret_key_value == false){
            system_status.net_status = Error_Secretkey;
        }
        /*  如果是TCP协议*/
        if(system_status.current_protocol == net_com_protocol.tcp){
            if (query_tcp_connect()) {
                /*  当前已经连接服务器了*/
                system_status.net_status = Connected_Server;
            }
            else {
                /*  没有连接服务器 ， tcp服务器重连*/
                system_status.net_status = NO_Connect_Server;
            }
        }
        /*  如果是udp协议*/
        else if(system_status.current_protocol == net_com_protocol.udp){
            if (udp_config_parameter.udp_status) {
                /*  当前已经连接服务器了*/
                system_status.net_status = Connected_Server;
            }
            else {
                /*  没有连接服务器 ， tcp服务器重连*/
                system_status.net_status = NO_Connect_Server;
            }
        }
        /*  如果是post协议*/
        else if(system_status.current_protocol == net_com_protocol.post){
            if (http_config_parameter.http_status) {
                /*  当前已经连接服务器了*/
                system_status.net_status = Connected_Server;
            }
            else {
                /*  没有连接服务器 ， tcp服务器重连*/
                system_status.net_status = NO_Connect_Server;
            }
        }
        /*  如果是get协议*/
        else if(system_status.current_protocol == net_com_protocol.get){
            if (http_config_parameter.http_status) {
                /*  当前已经连接服务器了*/
                system_status.net_status = Connected_Server;
            }
            else {
                /*  没有连接服务器 ， tcp服务器重连*/
                system_status.net_status = NO_Connect_Server;
            }
        }
        /*  如果是mqtt协议*/
        else if(system_status.current_protocol == net_com_protocol.mqtt){
            if(query_mqtt_connect()){
                /*  当前已经连接服务器了*/
                system_status.net_status = Connected_Server;
            }
            else {
                system_status.net_status = NO_Connect_Server;
            }
        }
        else {
            system_status.net_status = NO_Connect_Server;
        }
    }
    else {
        /*  设置net_status状态为0*/
        system_status.net_status = NO_Connect_Wifi;
    }
    /*  打印当前设备状态*/
    // print_current_system_status();
}

/*
 *  
 */
void wifi_reconnection(void){
    /*  取消定时器，就是不继续检测了。 如果一直开启着，一直进入wifi重连函数，出现冲突*/
    tciker_Net_Status.detach();
    setup_wifi();
    /*  开启定时器*/
    tciker_Net_Status.attach_ms(query_period, tciker_Net_Status_callback);
    serial_buf_clear();
}

void tcp_server_reconnection(void){
    /*  取消定时器，就是不继续检测了。 如果一直开启着，一直进入wifi重连函数，出现冲突*/
    tciker_Net_Status.detach();
    tcp_config();
    /*  开启定时器*/
    tciker_Net_Status.attach_ms(query_period, tciker_Net_Status_callback);
    serial_buf_clear();
}

void mqtt_server_reconnection(void){
    /*  取消定时器，就是不继续检测了。 如果一直开启着，一直进入wifi重连函数，出现冲突*/
    tciker_Net_Status.detach();
    mqtt_server_reconnect();
    /*  开启定时器*/
    tciker_Net_Status.attach_ms(query_period, tciker_Net_Status_callback);
    serial_buf_clear();
}

/*  打印当前设备状态*/
void print_current_system_status(void){
    switch (system_status.net_status){
        case NO_Connect_Wifi:
            serial_println("<<< Connecting to the network...");
            break;
        case NO_Connect_Server:
            serial_println("<<< Connecting to the server...");
            break;
        case Connected_Server:
            serial_println("<<< Connected to the server!!!");
            break;
        default:
            serial_println("<<< Other states!!!");
            break;
    }  
}
